Dada uma função f(x), encontre um x, tal que: f(x) = y0
## Bissecção
## Posição Falsa
Tem uma convergencia muito lenta.
$ g(x) = f(x) - y_0 = 0 $
[$x_a, x_b$] : intervalo
$y_a, y_b$ : tolerancia
$x_{med}$
Algoritmo:
$y = mx + c$
$m = (y_b - y_a)/(x_b - x_a) = y_{delta} / x_{delta}$
$y_a = ((y_b - y_a) / (x_b - x_a)) x + c$
$c = y_a - ((y_b - y_a) / (x_b - x_a)) x$
$c = (y_a*(x_b - x_a) - y_b * x_a + y_a * x_b) / (x_b - x_a)$
$x_{med} = ( (y_a*x_b) - (y_b*x_a) ) / (y_b - y_a)$
In [56]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
def g(x):
return x ** 3 + 3 * x - 5
# intervalos
xa = 0
xb = 3
ya, yb = g(xa), g(xb)
# plot
x = np.linspace(xa, xb, 100)
y = g(x)
plt.plot(x,y)
Out[56]:
In [59]:
print('xa = %.6f\txb = %.6f\txm = %.6f' % (xa, xb, xm))
for i in range(5):
if ym == 0:
print('encontrou')
elif (ya * ym) < 0:
xb = xm
yb = g(xm)
else:
xa = xm
ya = g(xm)
xm = (xb + xa) / 2.0
ym = g(xm)
plt.plot(x, y)
plt.grid(True)
plt.plot(xm, ym, 'ko')
plt.plot([xa, xa], [-5, 30], 'k')
plt.plot([xb, xb], [-5, 30], 'k')
plt.plot([xm, xm], [-5, 30], 'k--')
plt.show()
print('%d) x = %f | error = %.6f' % (i, xm, (1.0 - xm)))
print('xa = %.6f\txb = %.6f\txm = %.6f' % (xa, xb, xm))
In [ ]:
if xa ou xb seja atualizado 2 vezes consecutivas
aualizar o limite contrario por metade do intervalo atual
In [ ]: